package com.wande.dataplatform.filecollection.service;

import com.wande.common.mybatis.core.page.PageQuery;
import com.wande.common.mybatis.core.page.TableDataInfo;
import com.wande.dataplatform.filecollection.domain.bo.MappingRuleBo;
import com.wande.dataplatform.filecollection.domain.dto.FieldInfo;
import com.wande.dataplatform.filecollection.domain.dto.ValidationResult;
import com.wande.dataplatform.filecollection.domain.vo.MappingRuleVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 文件映射服务接口
 *
 * @author wande
 */
public interface IFileMappingService {

    /**
     * 创建映射规则
     *
     * @param bo 映射规则业务对象
     * @return 映射规则ID
     */
    Long createMappingRule(MappingRuleBo bo);

    /**
     * 更新映射规则
     *
     * @param bo 映射规则业务对象
     */
    void updateMappingRule(MappingRuleBo bo);

    /**
     * 删除映射规则
     *
     * @param id 映射规则ID
     */
    void deleteMappingRule(Long id);

    /**
     * 获取映射规则详情
     *
     * @param id 映射规则ID
     * @return 映射规则视图对象
     */
    MappingRuleVo getMappingRule(Long id);

    /**
     * 查询映射规则列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 映射规则列表
     */
    TableDataInfo<MappingRuleVo> listMappingRules(MappingRuleBo bo, PageQuery pageQuery);

    /**
     * 检测文件字段
     *
     * @param file     文件
     * @param fileType 文件类型
     * @return 字段信息列表
     */
    List<FieldInfo> detectFileFields(MultipartFile file, String fileType);

    /**
     * 查询目标表列表
     *
     * @param database 数据库名
     * @return 表名列表
     */
    List<String> listTargetTables(String database);

    /**
     * 获取表字段信息
     *
     * @param database 数据库名
     * @param table    表名
     * @return 字段信息列表
     */
    List<FieldInfo> getTableFields(String database, String table);

    /**
     * 验证映射规则
     *
     * @param bo 映射规则业务对象
     * @return 验证结果
     */
    ValidationResult validateMapping(MappingRuleBo bo);

    /**
     * 转换数据
     *
     * @param sourceData    源数据
     * @param mappingRuleId 映射规则ID
     * @return 转换后的数据
     */
    Map<String, Object> transformData(Map<String, Object> sourceData, Long mappingRuleId);

    /**
     * 测试校验规则
     * 使用示例数据测试校验规则配置
     *
     * @param bo 映射规则业务对象
     * @return 验证结果
     */
    ValidationResult testValidationRules(MappingRuleBo bo);

    /**
     * 获取可用的校验规则类型
     *
     * @return 校验规则类型列表
     */
    List<String> getAvailableValidationTypes();
}
